package dlwntk6545.swing.outline;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;


/*
		
		이벤트 처리하기
		스윙은 이벤트 중심 event-driven 임
		컴퍼넌트는 이벤트를 발생할 수 있고 개발자는 이것을 처리하는 코드를 작성해야 함
		이벤트 중심 패러다임은 스윙 뿐만 아니라 모든 GUI 프로그램의 사용자 상호작용의 근간(뿌리, 핵심)임
		스윙의 이벤트 처리 방식을 알아보기 전에 먼저 자바의 이벤트 처리 방식을 알아봄
		
		자바 이벤트 처리 모델
		자바에서 모든 객체를 자신의 상태변화를 다른 객체에게 알릴  수 있음
		event-driven 프로그래밍에서 이벤트 event 는 객체의 상태 변화를 의미함
		
		이 모델에는 3가지 참여자가 존재
		이벤트 source : 상태가 변경된 객체
		이벤트 object : 이벤트 소스의 상태변경을 캡슐화 한것
		이벤트 listener : 이벤트 소스의 상태변경을 통지하고 싶어하는 객체
		간단히 정리하면, 이벤트가 발생하면 이벤트 소스는 이벤트 객체를 만들어서 이벤트 리스너에게 보냄
		
		이벤트 소스 : 모든 객체는 이벤트 소스가 될 수 있음 
				    이벤트 소스 클래스는이벤트 리스너가 관심있어 하는 이벤트를 받으면
				    그것을 등록하거나 제거할 수 있는 메서드를 제공해야 함
				    예를 들어, JMenuItem 이 클릭되면 java.awt.ActionEvent 가 발생함
				    따라서, JMenuItem 에는 addActionListener 와 removeActionListener 메서드를 제공함
		
		이벤트 객체 : 이벤트 객체는 변경전 값과 변경후 새로운 값등의 이벤트의 특정유형에 대한 정보들이 캡슐화되어 있음
				    모든 이벤트 소스에는 이벤트 객체를 반환하는 getSource 메서드를 가지고 있음
		
		이벤트 리스너 : 특정 유형의 이벤트를 처리하기 위해 반드시 구현해야 하는 이너페이스를 의미
					모든 리스너 인터페이스는 java.util.EventListener 의 하위 인터페이스임
					이벤트 리스너 인터페이스는 반드시 해당 이벤트 객체를 받을 수 있는 메서드가 정의되어야 함
					actionPerformed(ActionEvent e)
					
		스윙에서 이벤트를 처리하려면 단지 이벤트 리스너를 작성해야 함
		왜냐하면, 스윙의 기본 이벤트 처리에서 이벤트소스와 이벤트객체를 미리 작업해 둠
		
		스윙에서 다뤄야 하는 이벤트 종료
		ActionEvent : AcitonListener -> JMenuItem, JButton 등의 버튼 들
		KeyEvent : KeyListener	-> 거의 대부분의 스윙 컴퍼넌트들
		MouseEvent : MouseListener	-> 거의 대부분의 스윙 컴퍼넌트들
		WindowEvent : WindowListener -> JFrame, JDialog 등의 컨테이너

*/


public class J07_HelloSwingEvent extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					J07_HelloSwingEvent frame = new J07_HelloSwingEvent();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public J07_HelloSwingEvent() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		
		//메뉴 이벤트 처리기 클래스를 등록
		
		J07_HelloSwingActionListener mnActionListener = new J07_HelloSwingActionListener();
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnFilef = new JMenu("File(F)");
		menuBar.add(mnFilef);
		
		JMenuItem mntmNewn = new JMenuItem("New (N)");
		mntmNewn.addActionListener(mnActionListener);
		mntmNewn.setActionCommand("new");
		mnFilef.add(mntmNewn);
		
		JMenuItem mntmClosec = new JMenuItem("Close (C)");
		mntmClosec.addActionListener(mnActionListener);
		mntmClosec.setActionCommand("close");
		mnFilef.add(mntmClosec);
		
		JMenuItem mntmExitx = new JMenuItem("Exit (X)");
		mntmExitx.addActionListener(mnActionListener);
		mntmExitx.setActionCommand("exit");
		mnFilef.add(mntmExitx);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
	}

}
